/*******************************************************************************
 * @project: Java_Algorithm
 * @package: com.burns.java.sort_algorithm
 * @file: BubbleSort.java
 * @author: Administrator
 * @created: 2017年5月16日
 * @purpose:
 * 
 * @version: 1.0
 * 
 * Revision History at the end of file.
 * 
 * Copyright 2017 AcconSys All rights reserved.
 ******************************************************************************/

package com.burns.java.sort_algorithm;

public class BubbleSort {
	/**
	 * 冒泡排序 比较相邻的元素。如果第一个比第二个大，就交换他们两个。
	 * 对每一对相邻元素作同样的工作，从开始第一对到结尾的最后一对。在这一点，最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤，除了最后一个。
	 * 持续每次对越来越少的元素重复上面的步骤，直到没有任何一对数字需要比较。
	 * 
	 * @param numbers
	 *            需要排序的整型数组
	 */
	public static int[] intArr = { 49, 38, 65, 97, 76, 13, 27, 48 };

	public static void main(String[] args) {
		System.out.println("冒泡排序之前的数组：");
		for (int i : intArr) {
			System.out.print(i + "、");
		}
		System.out.println();
		// 升序，先把最大的放在最后面
		// bubbleSortByASC_MaxFirst(intArr);
		// 升序，先把最小的放在最前面
		// bubbleSortByASC_MinFirst(intArr);

		// 降序，先把最小的放在最后面
		// bubbleSortByDESC_MinFirst(intArr);

		// 降序，先从把最大的放在最前面
		// bubbleSortByDESC_MaxFirst(intArr);

		System.out.println("冒泡排序之后的数组：");
		for (int i : intArr) {
			System.out.print(i + "、");
		}
	}

	/**
	 * 此排序是升序排序，而且是先把最大的先放在最后。所以j最小为0,最大为size - 1 - i。
	 * 
	 * @param numbers
	 */
	public static void bubbleSortByASC_MaxFirst(int[] numbers) {
		int temp = 0;
		int size = numbers.length;
		for (int i = 0; i < size - 1; i++) {
			for (int j = 0; j < size - 1 - i; j++) {
				if (numbers[j] > numbers[j + 1]) // 交换两数位置
				{
					temp = numbers[j];
					numbers[j] = numbers[j + 1];
					numbers[j + 1] = temp;
				}
				System.out.println("第" + i + "---" + j + "次排序后：===============");
				for (int i1 : intArr) {
					System.out.print(i1 + "、");
				}
				System.out.println();
			}
			System.out.println("第" + i + "次排序后：-----------------");
			for (int i1 : intArr) {
				System.out.print(i1 + "、");
			}
			System.out.println();
		}
	}

	/**
	 * 此排序是升序排序，而且是先把最小的先放在最前。所以j最小为不大于i,最大为size - 1。
	 * 
	 * @param numbers
	 */
	public static void bubbleSortByASC_MinFirst(int[] numbers) {
		int temp = 0;
		int size = numbers.length;
		for (int i = 0; i < size - 1; i++) {
			for (int j = size - 1; j > i; j--) {
				if (numbers[j] < numbers[j - 1]) // 交换两数位置
				{
					temp = numbers[j];
					numbers[j] = numbers[j - 1];
					numbers[j - 1] = temp;
				}
				System.out.println("第" + i + "---" + j + "次排序后：===============");
				for (int i1 : intArr) {
					System.out.print(i1 + "、");
				}
				System.out.println();
			}
			System.out.println("第" + i + "次排序后：-----------------");
			for (int i1 : intArr) {
				System.out.print(i1 + "、");
			}
			System.out.println();
		}
	}

	/**
	 * 此排序是降序排序，而且是先把最小的先放在最后。所以j最小为0,最大不超过为size-i - 1。
	 * 
	 * @param numbers
	 */
	public static void bubbleSortByDESC_MinFirst(int[] numbers) {
		int temp = 0;
		int size = numbers.length;
		for (int i = 0; i < size - 1; i++) {
			for (int j = 0; j < size - 1 - i; j++) {
				if (numbers[j] < numbers[j + 1]) // 交换两数位置
				{
					temp = numbers[j];
					numbers[j] = numbers[j + 1];
					numbers[j + 1] = temp;
				}
				System.out.println("第" + i + "---" + j + "次排序后：===============");
				for (int i1 : intArr) {
					System.out.print(i1 + "、");
				}
				System.out.println();
			}
			System.out.println("第" + i + "次排序后：-----------------");
			for (int i1 : intArr) {
				System.out.print(i1 + "、");
			}
			System.out.println();
		}
	}

	/**
	 * 此排序是升序排序，而且是先把最大的先放在最前。所以j最小为不大于i,最大为size - 1。
	 * 
	 * @param numbers
	 */
	public static void bubbleSortByDESC_MaxFirst(int[] numbers) {
		int temp = 0;
		int size = numbers.length;
		for (int i = 0; i < size - 1; i++) {
			for (int j = size - 1; j > i; j--) {
				if (numbers[j] > numbers[j - 1]) // 交换两数位置
				{
					temp = numbers[j];
					numbers[j] = numbers[j - 1];
					numbers[j - 1] = temp;
				}
				System.out.println("第" + i + "---" + j + "次排序后：===============");
				for (int i1 : intArr) {
					System.out.print(i1 + "、");
				}
				System.out.println();
			}
			System.out.println("第" + i + "次排序后：-----------------");
			for (int i1 : intArr) {
				System.out.print(i1 + "、");
			}
			System.out.println();
		}
	}

}

/**
 * 输出结果： 冒泡排序之后的数组： 49、38、65、97、76、13、27、48、 第0---0次排序后：===============
 * 38、49、65、97、76、13、27、48、 第0---1次排序后：=============== 38、49、65、97、76、13、27、48、
 * 第0---2次排序后：=============== 38、49、65、97、76、13、27、48、
 * 第0---3次排序后：=============== 38、49、65、76、97、13、27、48、
 * 第0---4次排序后：=============== 38、49、65、76、13、97、27、48、
 * 第0---5次排序后：=============== 38、49、65、76、13、27、97、48、
 * 第0---6次排序后：=============== 38、49、65、76、13、27、48、97、 第0次排序后：-----------------
 * 38、49、65、76、13、27、48、97、 第1---0次排序后：=============== 38、49、65、76、13、27、48、97、
 * 第1---1次排序后：=============== 38、49、65、76、13、27、48、97、
 * 第1---2次排序后：=============== 38、49、65、76、13、27、48、97、
 * 第1---3次排序后：=============== 38、49、65、13、76、27、48、97、
 * 第1---4次排序后：=============== 38、49、65、13、27、76、48、97、
 * 第1---5次排序后：=============== 38、49、65、13、27、48、76、97、 第1次排序后：-----------------
 * 38、49、65、13、27、48、76、97、 第2---0次排序后：=============== 38、49、65、13、27、48、76、97、
 * 第2---1次排序后：=============== 38、49、65、13、27、48、76、97、
 * 第2---2次排序后：=============== 38、49、13、65、27、48、76、97、
 * 第2---3次排序后：=============== 38、49、13、27、65、48、76、97、
 * 第2---4次排序后：=============== 38、49、13、27、48、65、76、97、 第2次排序后：-----------------
 * 38、49、13、27、48、65、76、97、 第3---0次排序后：=============== 38、49、13、27、48、65、76、97、
 * 第3---1次排序后：=============== 38、13、49、27、48、65、76、97、
 * 第3---2次排序后：=============== 38、13、27、49、48、65、76、97、
 * 第3---3次排序后：=============== 38、13、27、48、49、65、76、97、 第3次排序后：-----------------
 * 38、13、27、48、49、65、76、97、 第4---0次排序后：=============== 13、38、27、48、49、65、76、97、
 * 第4---1次排序后：=============== 13、27、38、48、49、65、76、97、
 * 第4---2次排序后：=============== 13、27、38、48、49、65、76、97、 第4次排序后：-----------------
 * 13、27、38、48、49、65、76、97、 第5---0次排序后：=============== 13、27、38、48、49、65、76、97、
 * 第5---1次排序后：=============== 13、27、38、48、49、65、76、97、 第5次排序后：-----------------
 * 13、27、38、48、49、65、76、97、 第6---0次排序后：=============== 13、27、38、48、49、65、76、97、
 * 第6次排序后：----------------- 13、27、38、48、49、65、76、97、 冒泡排序之后的数组：
 * 13、27、38、48、49、65、76、97、
 */

/*******************************************************************************
 * <B>Revision History</B><BR>
 * [type 'revision' and press Alt + / to insert revision block]<BR>
 * 
 * 
 * 
 * Copyright 2017 AcconSys All rights reserved.
 ******************************************************************************/